#define _CRT_SECURE_NO_WARNINGS 1


		《 Linux yum本地配置 》



            《wget》
wget 命令是一个非交互式网络下载器，用于从指定 url 下载文件。
wget 是 Linux 环境下流行的强大稳定的下文件下载工具
安装 wget：    sudo yum install wget
wget -O ./路径/改名字 https://mirrors.aliyun.com/repo/Centos-7.repo下载文件的链接



4.yum本地配置(说)

该路径下存储，下载文件的对应链接。
ls / etc / yum.repos.d /  
【CentOS - Base.repo】配置文件仓库   CentOS - fasttrack.repo  CentOS - Vault.repo
CentOS - CR.repo         CentOS - Media.repo      CentOS - x86_64 - kernel.repo
CentOS - Debuginfo.repo  CentOS - Sources.repo
//打开这个文件，里面基本上都是一些内置链接。 
[a@192 ~]$ vim / etc / yum.repos.d / CentOS - Base.repo 


比如访问：百度网页
wget www.baidu.com
打开网页
cat index.html 
我们也以命令进行网络请求比如打开百度，登录，下载内容等等。。。


配置将来是在干什么 ? ? ?
yum会根据 / etclyum.repos.d / 该路径下面的配置文件，来构成自己的下载链接，
（根据OS版本，根据你要下载的软件)，yum帮助我们下载，安装一般的机器，
内置的链接地址是centos的官网，软件链接都指向的是国外的。yum可能会比较慢，所以需要配置
如何配置 ? 本质就是更改文件，或者更改文件内容。

阿里云镜像源

1.备份
1 mv (路径)/etc/yun.repos.d/CentOS-Base.repo(更改名称) /etc/yur.repos.d/CentOs - Base.repo.backup(源文件)
2.下载新的 CentOs-Base.repo 到 /etclyum.repos.d /
wget -O /etc/yum.repos.d/CentOS - Base.repo https ://mirrors.aliyun.com/repo/Centos-7.repo
3.清除缓存、生成缓存、升级更新
yum clean all       清除缓存
yum makecache       生成缓存
yum - y update      升级更新

阿里云官方镜像站
https ://developer.aliyun.com/mirror/


        《 windows <==> Linux 文件互传 》
windows 上传文件到 Linux 
 安装 lrzsz
 sudo yum install -y lrzsz  //安装成功会出现选择窗口弹窗
 
rz -E           //windows上传 ==> Linux

sz test111.txt // 把 Linux 中的文件下载到 windows 中。

wget 120.78.126.148:/home/whb/108/lesson10/test.c //获取IP主机该路径的文件 test.c 

scp 远程拷贝：
scp 120.78.126.148:/home/whb/108/lesson10/test.c //把远端文件拷贝到本地，获取 IP 主机该路径的文件 test.c 
scp root@120.78.126.148:/home/whb/108/lesson10/test.c //以root的身份把远端文件拷贝到本地，获取 IP 主机该路径的文件 test.c 


--------------------------------------------------------------------------------------------------------------------------------


    《 创建新用户 》：


1. root创建新用户： [root@192 b]# sudo adduser c
2.其他用户创新新用户：
[b@192 ~]$ sudo adduser c
[sudo] password for b: 
//重新设置密码:
[c@192 b]$ sudo password c

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for c:  ******

//root 重新给 C用户 设置密码
[root@192 c]# passwd c
Changing password for user c.
New password: 
BAD PASSWORD: The password is a palindrome
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@192 c]# su c
[c@192 ~]$ 

--------------------------------------------------------------------------------------------------------------------------------

    《 远程登录 其他用户账号 》: 

首先得知道对方的IP 地址: 192.168.35.129
[b@192 home]$ uname -a
Linux 192.168.35.129 3.10.0-1160.119.1.el7.x86_64 #1 SMP Tue Jun 4 14:43:51 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
a用户 远程切换 b用户：
[a@192 home]$ ssh b@192.168.35.129
b@192.168.35.129's password:        //输入b的密码: ******
[b@192 ~]$                          //切换成功！
[b@192 ~]$ pwd
/home/b

--------------------------------------------------------------------------------------------------------------------------------




			《 vi/vim 》

进入vim 后的4种基本模式：
插入模式:编辑模式。
命令模式 : 允许使用者通过命令，来进行文本的
编辑控制
底行模式 : 用来进行让vim进行包括但不限于
shell进行交互的。

vim 刚开始打开文件 处于命令模式，无法正常输入， 
 i   进入插入模式
 Esc 退出插入模式
 :   进入底行模式
 wq  进入底行模式后 wq 退出


[a@192 ~]$ vim test.c  //vim 打开 test.c 
 输入内容：...
[a@192 ~]$ cat test.c		//打开输入的内容：
#include <stdio.h>

int main()
{
    printf("hello vim!\n");
    return 0;
}
[a@192 ~]$ gcc test.c		//编译程序
//生成 a.out 文件
[a@192 ~]$ . / a.out //运行程序：
hello vim!

		< 调用行号 >
进入底行模式：
 ：set nu		//调用行号
Esc  退出底行模式

		< 多行复制粘贴 >
A.命令模式
yy : 复制当前行
 p : 粘贴，当前光标的下一行
 u : 撤销

#include <stdio.h>
int main()
{
    printf("hello vim!\n");
    printf("hello vim!\n");
    printf("hello vim!\n");
 
    return 0;
}


	《 n+p 》:粘贴n次
 yy : 复制当前行
 5p : 粘贴，当前光标的下一行,粘贴5次
#include <stdio.h>
int main()
{
    printf("hello vim!\n");
    printf("hello vim!\n");
    printf("hello vim!\n");
    printf("hello vim!\n");
    printf("hello vim!\n");
    printf("hello vim!\n");
    return 0;
}
  u : 撤销

		《 5yy 》
n + yy: 复制当前行——向下 n 行 (连续复制n行)
n + p : 粘贴，当前光标的下一行n : 表示把指定内容粘贴n次
u : 撤销
Ctrl + r ：反回上一步

 5yy 10p 
复制光标向下共5行，这5行都到光标位置向下粘贴10次 
 (注意调整光标位置)

		< 剪切/删除 >
 dd 剪切/删除光标所在行  // dd + p 剪切+粘贴
 5dd 剪切光标所在至向下5行 

		< 光标定位 >
  $  定位光标至当前行结尾 ：Shift + 4
  ^  定位光标至当前行开始 ：Shift + 6
  gg 定位光标至最开始位置,  5gg 定位到第5行 == 5G
  G  定位光标至最末尾位置 ：Shift + g
  5G 定位光标至 指定位置5 : n + Shift + g  ==> nG
  h j k l 分别对应 ← ↓ ↑ →
  支持：nh  nj  nk  nl ：n移动指定的数字 的操作方式
  w  逐单词进行 光标后移
  b  逐单词进行 光标前移
  Ctrl + r 对历史撤销进行撤销。 类似 Ctrl+z 返回上一步
  ~  大小写切换，可长按，长按可以将光标位置的字符逐一切换大小写。
  支持n~ : 5~ 光标位置起 向后5位切换大小写.
  x  删除光标位置字符，可长按，长按可以将光标位置的字符逐一删除。末尾删完会向前删除。
  支持nx : 从光标位置删除指定n个数字符，一行内 
  X  删除光标位置前1字符   ：Shift + x
	支持nX : 删除光标位置前n个字符，一行内
  r  替换光标位置字符 
  支持nr  : 5r w 光标位置替换5个字符为 w ：wwwww 
  R  替换 ：覆盖写，直接进行文本替换 ：Shift + r

		< 进入插入模式 >
  a  光标后一个位置进入插入模式
  i  光标位置进入插入模式
  o  光标位置向下新起一行进入插入模式

		< 进入底行模式后 >
  q   退出，(会提示当前内容未保存)
  q!  强制退出：默认为不保存！
  w   保存
  wq  保存并退出 
  wq！保存并强制退出 
  set nu   : 打开行号
  set nonu : 去掉行号
  s/把什么/替换成什么/g 
  /关键字  查找关键字
  !   强制命令
  !command:不退出vim,可以进行shell命令执行。常用函数查看， !man printf (不退出，查看prinft函数)

vim code.c //不保存是不会创建 code.c 这个文件的。支持分屏
 vs test.c //创建 test.c ,不保存是不会创建

		< 命令模式 >
 ZZ   保存并退出， Shift + zz
 Ctrl+z 暂停Stopped(任然在跑)， 注意与上一条命令容易按错。

[c@192 c]$ jobs     查看正在跑的文件
[1]+  Stopped                 vim test.c

 fg 1  回到暂停的文件。
c@192 c]$ ps ajx | grep vim     查看暂停文件详情，(查看进程 PID: 3014, kill 杀掉该进程)
  2512   3014   3014   2512 pts/0      3125 T     1002   0:00 vim test.c
  2512   3126   3125   2512 pts/0      3125 S+    1002   0:00 grep --color=auto vim
[c@192 c]$ kill -9 3014         // kill -9 杀掉进程 3014 
[1]+  Killed                  vim test.c

//杀掉该 进程后，打开该文件，会提示临时文件， D 可以删除临时文件(如果删除不掉，再去手动删除 隐藏的临时文件)
[c@192 c]$ vim test.c

Swap file ".test.c.swp" already exists!
[O]pen Read-Only只读打开, (E)dit anyway编辑, (R)ecover恢复, (D)elete it删除, (Q)uit退出,
(A)bort中止:


		< 每次打开异常弹窗 >
 Ctrl+z 暂停，或者突然断网后会存在一个零时隐藏文件，保存之前的数据，方便恢复。
 ls -al 可以查看隐藏文件，每次打开弹窗如果不想D删除零时文件，
 可以把隐藏的零时文件删除掉，就可以避免弹窗


		< 注释：>
1.  Ctrl+v 进入 -- VISUAL BLOCK -- 模式，
2.  n+Shift+g 从光标位置选中到 n 位置进行区域选择。 也可以 ↑ ↓ ← → 选择 
3.  Shift + I  进入输入模式 ：输入 '//' 注释符 
4.  Esc Esc 从光标位置到 n 行的位置(选择区域)全部注释。
5.  x删除光标位置的1个字符， X删除光标 前1个 字符(用于删除 /* ... */ 时)

		< 删除注释 >
1.  Ctrl+v 进入 -- VISUAL BLOCK -- 模式，
2.  n+Shift+g + →（或者+ l） 从光标位置选中到 n 位置进行区域选择。 + → 加选1格注释 // 。 也可以 ↑ ↓ ← → 选择 
3.  d  删除


 《 普通用户无法进行 sudo 提权 》
 ls /etc/sudoers
  /etc/sudoers  //在配置文件中添加自己
[a@192 ~]$ ls / etc / sudoers - l
- r-- r-- --- . 1 root root 4328 Sep 30  2020 / etc / sudoers

[a@192 ~]$ whoami
a		//首先明确自己是什么用户
 "/etc/sudoers" [Permission Denied]   //普通用户没有读取该文件权限

切换 root 用户
[a@192 ~]$ su
Password :
[root@192 a] # vim / etc / sudoers 
 大约在100行的位置，
root    ALL = (ALL)ALL 
a       ALL = (ALL)ALL  // 新添加一 a ，可以yy上面一行p,进行复制粘贴。
Shift : 进入底行模式
 wq  保存并退出(警告提示) wq!

切回普通用户：
[a@192 ~]$ sudo touch file.txt 就可以创建文件了。


			《 vim配置文件 》
 vim 打开 文件时不只单单操作该文件，会同时进行一个 .vimrc 的配置文件
 如果没有改文件，也可以自己手动创建一个(注意要在 家目录 cd~)： touch .vimrc
 vim.vimrc  //打开配置文件
开始进行写入：
 set nu  // 显示行号，保存后，从新打开 test.c 文件就会按配置过后的文件格式进行打开
  1 set nu              " 显示行号
  2 set tabstop=4       " TAB == 4
  3 set cursorline      " ____当前行光标线_____________
  4 syntax on           " 开启语法高亮
  5 set smartindent     " 智能缩进
  6 set autoindent      " 新行自动缩进，使得新行缩进和上一行一样
  7 set shiftwidth=4    " 设置自动缩进为4个空格宽度

 gitee 上搜索：vimforcpp  有已经配置好的主题插件。
 例如：以下路径：进行安装插件
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
//注意：安装完成后，最后的 倒数第2项目 <快速保存> 的这 3行 代码 跟 ↑ ↓ → ← 冲突为 A B C D (删除后恢复正常)

————————————————————————————————————————————————————————————————


如果程序编译不过去，可能是版本不支持C99，
 gcc test.c -std=c99 

		<编译程序并重命名>
1. gcc test.c -o my.exe	//gcc 无法编译C++代码
   gcc -o my.exe test.c	// -o 重命名 ，位置可以调换。
2. g++ -o my.exe test.cpp	//g++ 可以编译C语言代码，也可以编译C++
   g++ test.cc -o my.exe   
 [b@192 111]$ gcc test.c -o my.exe -std=c99【编译程序并重命名】-o 后面紧跟 重命名
[b@192 111]$ gcc -o my.exe test.c -std=c99【2种方式都可以】
[b@192 111]$ ll
total 28
- rwxrwxr - x. 1 b b 8400 Jan 26 01:17 a.out		// 程序默认编译为： a.out 
- rwxrwxr - x. 1 b b 8400 Jan 26 01 : 20 my.exe	// 重命名为 a.out：my.exe


		《 yum 安装 g++ 》
        
安装: [root@192 c]# yum install gcc-c++ 	(没有空格 gcc-c++)

C++ 后缀一般分为 2种： .cpp / .cc
linux 默认不支持 C++ 编译，需要使用 g++ 进行编译
 g++ test.cc				//如果无法编译：
 g++ test.cc -std=c++11	//使用C++ 新标准11

[b@192 111]$ cat test.c
#include <stdio.h>
int main()
{
	for (int i = 0; i < 10; i++)
 	{
		printf("hello linux: %d\n", i);
	}
	return 0;
}
[b@192 111]$
[b@192 111]$ g++ test.c
- rwxrwxr - x. 1 b b 8400 Jan 26 01:54 a.out //生成默认文件
[b@192 111]$ . / a.out
hello linux : 0
hello linux : 1
hello linux : 2
hello linux : 3
hello linux : 4
hello linux : 5
hello linux : 6
hello linux : 7
hello linux : 8
hello linux : 9

————————————————————————————————————————————————————————————————


如果要升级
搜索：gcc/g++ scl 工具集升级，yum

		《 常见的C++ 后缀 》
            test.cc  
 mv test.cc test.cpp // 把.cc 后缀改为 .cpp //两个都是C++文件的后缀
 mv test.cc test.cxx

 查看g++版本
[b@192 111]$ g++ -v
[b@192 111]$ g++ --version
版本：g++ (GCC)4.8.5 20150623 (Red Hat 4.8.5 - 44)


		《 程序翻译的过程：》
【翻译过程】  【       gcc命令      】      【说明】
 预处理        gcc -E test.c -o test.i       宏替换，去注释，头文件展开，条件编译(-E 预处理完就停下，头文件展开:头文件中的内容拷贝到原文件中了)
               gcc -D V1=1 proj.c	        //命令行式的 宏定义：  只V1 生效：条件编译 实现动态裁剪
 编译          gcc -S test.i -o test.s       将C变成汇编语言:test.s

 汇编          gcc -c test.s -o test.o       汇编语言编译成为，二进制目标文件

 链接          gcc test.o -o my.exe          形成可执行程序(链接库)//链接完就可以正常执行文件了。
 

//  <加减权限 x>
test.o 二进制目标文件 是一个临时文件，即使加上权限 x 也是不能被执行的：
chmod +x test.o	//汇编完，即使加了可执行权限。也无法运行，因为它本身不是一个可执行文件。
//最后编译了才可以形成： 可执行文件 my.exe
[c@192 c]$ g++ test.o -o my.exe

注意：键盘左上角：ESc  与程序编译的顺序是一一匹配的。
 后缀 .i .s .o	//   与镜像文件后缀 .iso 一致。

//查看 test.o 文件的信息
[c@192 c]$ file test.o
test.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped


	《 Linux 中的库 》
 ls /usr/include/   //库的路径
 vim /usr/include/stdio.h   //打开 stdio.h 这个头文件，里面有900多行内容。


		《 预处理：》
 -E 的意思：执行完预处理就停下
[b@192 111]$ vim test.c
[b@192 111]$ gcc -E test.c -o test.i  // test.i 预处理后的内容放入 test.i 文件中 
- rw - rw - r--. 1 b b 16976 Jan 27 07 : 46 test.i   // 生成 .i文件
[b@192 111]$ vim test.i  // 打开文件后的内容就是预处理后的样子

Esc  进入命令模式
 vs test.c	// 分屏打开文件 test.c 
 Ctrl + ww   切换分屏


——————————————————————————————————————————————————————


——————————————————————————————————————————————————————


		《 条件编译 实现动态裁剪 》

//类似 普通版V1， 旗舰版V2， 专业版V3 的区别， 通过 动态裁剪 展现不同功能给用户！


#include <stdio.h>
#define V2 1		    // 定义了V2 ：V2 生效
int main() 
{
#ifdef V1               // (如果定义了 V1)
	printf("功能1\n");
#elif V2                // (如果定义了 V2)
	printf("功能1 \n"); 
	printf("功能2\n");
	printf("功能3\n");
#else                   // (否则运行这里)
	printf("功能1\n");
	printf("功能2\n"); 
	printf("功能3\n");
	printf("功能4\n");
	printf("功能5\n");
	printf("功能6\n");
#endif
		return 0;
}


	<命令行式的宏>
gcc -D V1=1 proj.c	// V1 生效：条件编译 实现动态裁剪： 在命令行模式进行手动裁剪

//裁剪出 V1 部分
[c@192 c]$ g++ -DV1=1 proj.c
[c@192 c]$ ./a.out 
功能1

//裁剪出 V2 部分
[c@192 c]$ g++ -DV2=1 proj.c
[c@192 c]$ ./a.out 
功能1 
功能2
功能3


——————————————————————————————————————————————————————


——————————————————————————————————————————————————————

	《 编译器的自举：》
 用二进制写了一个     ==> 汇编的编译器，
 用汇编的编译器写一个 ==> 纯汇编的编译器，
 新的汇编的编译器写   ==> C语言编译器
 C语言编译器写        ==> 纯C编译器

——————————————————————————————————————————————————————


